ATTENZIONE! Non rimuovere jumps o renderli incondizionati! L'ottimizzatore crashera' e la vostra patch ART fallira'! Per evitarlo, utilizzare jumps condizionali use conditional jumps. Per esempio, se si necessita di un jump, rimpiazzare il jump con il codice if-eq v0,v0 (bytes: 32 00 ?? ??). Se non e'necessario effettuare un jump in una specifica posizione, e'possibile inserire un jump del tipo if-ne v0,v0 (bytes: 33 00 ?? ??); e'possibile utilizzare un qualunque equivalente di codice personalizzato.
Il file della patch deve avere lo stesso nome del APK che si vuole modificare (attenzione: si fa distinzione tra maiuscole e minuscole).
Se si vuole creare una patch che comprenda piu'files si puo'utilizzare il parametro _%25ALL%25; ad esempio, per i files voce di SVOX, il nome sara': com.svox.classic.langpack_%25ALL%25.txt; il parametro _%25ALL%25 sara'sostituito dalla parte di nome del package, che variera'a seconda delle impostazione del programma. Non utilizzare caratteri speciali o formattazioni nel file della patch (utilizzare solamente spazi singoli).
Se si vuole creare una patch che comprenda piu'files e si vuole aggiungere un prefisso all'inizio, si possono utilizzare %25ALL%25_ e _%25ALL%25 (Esempio: chelpus.%25ALL%25_com.android._%25ALL%25.txt). E'possibile patchare in modo custom %25PACKAGE_NAME%25 per percorsi ai files, la stringa %25PACKAGE_NAME%25 rimpiazzera'il nome dell'applicazione del pacchetto bersaglio.
Per ricercare patterns di bytes utilizzare IDA Pro 6.1: questo programma e'in grado di aprire i files dalvik-cache, odex, librerie e classes.dex.
Se si desidera patchare files dalvik-cache od odex ricordare sempre che i bytes di dati possono variare all'interno di firmwares differenti. Non dimenticate che non tutti i bytes non corrispondono tra classes.dex, dalvik-cache ed odex. Utilizzare IDA Pro per vedere files classes.dex ed i files odex.
[BEGIN]
<commenti alla patch che sono visibili all'utente prima di applicare la patch;
Patch per XYZ Pro 5.0.5
[PACKAGE]
<scompatta classes.dex ed applica tutte le patches dalle [CLASSES] al file. Genera il file odex basandosi sulle modifiche applicate al file classes.dex.>
[CLASSES]
<pattern cerca/sostituisci per classes.dex (vedere sotto)>
{"search":"63 R00 R01 R02 38 00 04 00 12 10 0F 00"}
{"group":"1"}
{"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"replaced":"12 00 6A W00 W01 W02 00 00 12 S0 0F 00"}
[LIB]
<pattern cerca/sostituisci per librerie native (vedi sotto)>
{"name":"libtitanium.so"}
{"original":"00 ** 50 e2"}
{"replaced":"00 00 50 e1"}
[OTHER FILES]
<pattern cerca/sostituisci per altri files presenti nella cartella /data/data/Package_Target_APK/ (vedi sotto)>
{"name":"/files/shell.dex"}
{"original":"0F 00 00 00 1A 00 00 00 0F 00 00 00 59 00 00 00 2F"}
{"replaced":"0F 00 00 00 0F 00 00 00 0F 00 00 00 59 00 00 00 2F"}
[OTHER FILES]
{"name":"/mnt/sdcard/Android/package-name/files/lives.xml"}
{"original":"63 68 65 6C 70 61"}
{"insert":"63 68 65 6c 70 61 61 61"}
[FILE_IN_APK]
{"name":"assets/bin/Data/Managed/O7SharpCompress.dll"}
{"original":"0F 00 00 00 1A 00 00 00 0F 00 00 00 59 00 00 00 2F"}
{"replaced":"0F 00 00 00 0F 00 00 00 0F 00 00 00 59 00 00 00 2F"}
[ADD-BOOT]
<aggiungi automaticamente la patch utente corrente alla BootList. Dovrebbe essere utilizzato nella patch library (o nella patch [CLASSES] senza [ODEX] o senza [PACKAGE])>
[END]
<commenti alla patch che sono visibili all'utente dopo aver applicato la patch>
Congratulazioni! Programma crackkato!
“search” – questo parametro permette di cercare un pattern e salvare bytes in specifiche posizioni.
{"search":"63 R00 R01 R02 38 00 04 00 12 10 0F 00"}
In questo esempio i bytes in verde creano la maschera del pattern, mentre i bytes in giallo, da R00 -> R02, saranno salvati.
I bytes salvati devono essere nell'ordine R00, R01, R02, R03…
I bytes salvati non possono essere ripetuti.
"group" - imposta i patterns del gruppo (il group number puo'essere 1 o maggiore). Cosa signficia ? Significa che se almeno un pattern del gruppo ha avuto successo, verra'mostrato un messaggio di patch applicata con successo. Cio'puo'essere utile per tentare di effettuare una patch universale per piu'versioni della stessa applicazione (per esempio una patch per tutte le versioni di Google Play per disabilitare gli aggiornamenti automatici).
“original” – questa e' una maschera del pattern utilizzata per cercare l'offset al quale la patch verra'applicata.
{"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
In questo esempio i bytes in verde creano la maschera del pattern, mentre i bytes in giallo rappresentano i caratteri jolly (??, **)
“replaced” – segue una dichiarazione di tipo “original”, e rappresenta i dati che riempiranno l'offset.
{"replaced":"12 00 6A W00 W01 W02 00 00 12 00 0F 00"}
In questo esempio i bytes in verde sovrascriveranno la locazione bersaglio.. i bytes in giallo rappresentano i dati trovati e salvati dalla precedente istruzione “search”
“name” – viene utilizzato per prendere come bersaglio uno specifico nome di libreria (vedi sopra in [LIB])
<S0 , S1 - impostano rispettivamente la variabile smali a 0 o ad 1.
Ad esempio, esiste una variabile : const/4 v?,0x00 . I punti di domanda evidenziano che il valore var\e' sconosciuto (ad esempio e'stato cambiato in una versione piu'recente), ma si e'sicuri che questa variabile sia uguale a 0 e la si vuole impostare ad 1. In questo caso il pattern sara'del tipo:
{"original":"12 ?? ?? ?? ?? ??"}
{"replaced":"12 S1 ?? ?? ?? ??"}
E viceversa, per impostare la variabile a 0:
{"original":"12 ?? ?? ?? ?? ??"}
{"replaced":"12 S0 ?? ?? ?? ??"}
"replace_from_file" - questo seguira'una dichiarazione "original" , questo sovrascrivera'l'offset con i bytes provenienti dal file (il file deve essere salvato come patch specifica (custom)).
{"replace_from_file":"array.bin"}
Si procede in questo modo per evitare di scrivere templates troppo lunghi da rimpiazzare.
"insert" - Se si desidera inserire una lunghezza di dati maggiore della lunghezza del pattern originale.
(Example)file before patch contain:"chelpa end"
{"original":"63 68 65 6C 70 61"}
{"insert":"63 68 65 6c 70 61 61"}
il file dopo la patch continene:"chelpaa end"
[LIB-ARMEABI],[LIB-ARMEABI-V7A],[LIB-MIPS] oppure [LIB-X86] - per librerie provenienti da /lib/armeabi/, /lib/armeabi-v7a/, /lib/mips/, /lib/x86/.
[ODEX-PATCH] - La patch ha gia'creato il file odex. Ad esempio, se una applicazione e'gia'stata patchat con la rimozione automatica della verifica della licenza, ma si ha necessita'di applicare ulteriori modifiche utilizzando una patch specifica (custom). Se utilizziamo un semplice [PACKAGE]-[CLASSES], [ODEX] o [CLASSES]-[ODEX], il file odex verra'creato senza modifiche e solo a questo punto sara'applicata la patch.
Example:
[BEGIN]
[ODEX-PATCH]
{"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"replaced":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
[END]
Congratulazioni! ODEX modificato!
[CLASSES] senza [PACKAGE] - Patcha dalvik-cache delle applicazioni. Non dimenticare che il sistema, periodicamente, aggiorna la dalvik-cache delle applicazioni e tutte le modifiche alla stessa scompariranno. Se questo non ci andasse bene, dobbiamo aggiungere [ADD-BOOT]. Patch della dalvik-cache scaduta, inaffidabile. Ma necessario per ROM Toolbox, poiche'trova il file odex e si comporta in modo isterico.
Example:
[BEGIN]
[CLASSES]
{"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"replaced":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
[ADD-BOOT]
[END]
Congratulations!
[ODEX] - Copia la dalvik-cache in /data/app/ e rinomina il file odex, di seguito applica tutte le patch a questo file odex. Il checksum del file odex risulta errato, non passa il controllo, a differenza del file odex creato [PACKAGE] - [CLASSES].
Esempio:
[BEGIN]
[ODEX]
{"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"replaced":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
[END]
Congratulazioni!
[CLASSES]-[ODEX] - Patcha la dalvik-cache e successivamente copia la dalvik-cache in /data/app/ e rinomina il file odex. Il checksum del file odex e della dalvik-cache risultano errati, non passano il controllo, a differenza del file odex creato [PACKAGE] - [CLASSES].
Esempio:
[BEGIN]
[CLASSES]
{"original":"63 ?? ?? ?? 38 00 04 00 12 10 0F 00"}
{"replaced":"12 00 6A ?? ?? ?? 00 00 12 00 0F 00"}
[ODEX]
[END]
Congratulazioni!
[COMPONENT] - Abilita o disabilita componenti nelle applicazioni.
Esempio:
[BEGIN]
[COMPONENT]
{"disable":"com.superApp.adsActivity"}
{"enable":"com.superApp.fullVersion.Provider"}
{"disable":"com.android.vending.CHECK_LICENSE"}
[END]
Congratulazioni!
[SQLITE] - A volte l'applicazione bersaglio deve modificare qualcosa nel database, dunque puo'venire in aiuto questa possibilita':
Esempio:
[BEGIN]
Reset del Periodo di Prova
[SQLITE]
{"database":"/data/data/com.package.megaapp/databases/settings.db"}
{"execute":"DELETE FROM table_settings WHERE name = 'SETTING__LIC'"}
{"execute":"UPDATE table_settings SET UsedDays=0 WHERE name='Trial_set'"}
[END]
Congratulazioni! Hai un nuovo Periodo di Prova!
database - percorso al database nel dispositivo, oppure e'possibile utilizzare solamente il nome del database che verra'poi cercato dal motore di ricerca di Lucky Patcher.
execute - SQLite query.
[SET_PERMISSIONS] - Analogo al comando linux "chmod permissions file_name" per i files situati nella cartella dati dell'Applicazione:
Esempio:
[BEGIN]
Reset del Periodo di Prova
[SET_PERMISSIONS]
{"file_name":"/files/stats"}
{"permissions":"777"}
[OTHER FILES]
{"name":"/files/stats"}
{"original":"4D 4D 46 31"}
{"replaced":"00 4D 46 30"}
[SET_PERMISSIONS]
{"file_name":"/files/stats"}
{"permissions":"444"}
[END]
Congratulazioni! Hai un nuovo Periodo di Prova!